home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 001-100 / 001-025 / 004 / bison / calc.y < prev    next >
Text File  |  1995-03-17  |  1KB  |  113 lines

  1. %{
  2. #include <ctype.h>
  3.  
  4. int regs[26];
  5. int base;
  6.  
  7. int val;
  8. int printflag;
  9.  
  10. %}
  11.  
  12. %start stmt
  13.  
  14. %token DIGIT LETTER
  15.  
  16. %left '|'
  17. %left '&'
  18. %left '+' '-'
  19. %left '*' '/' '%'
  20. %left UMINUS
  21.  
  22. %%
  23.  
  24. stmt    :    expr
  25.             { val = $1; printflag = 1; }
  26.     |     LETTER '=' expr
  27.             { regs[$1] = $3; }
  28.     ;
  29.  
  30. expr    :    '(' expr ')'
  31.             { $$ = $2; }
  32.     |    expr '+' expr
  33.             { if ($1 == 69)
  34.                 {
  35.                   $$ = 2;
  36.                   printf ("$1 became %d\n", $1);
  37.                   $1 = 69;
  38.                 }
  39.               $$ = $1 + $3; }
  40.     |    expr '-' expr
  41.             { $$ = $1 - $3; }
  42.     |    expr '*' expr
  43.             { $$ = $1 * $3; }
  44.     |    expr '/' expr
  45.             { $$ = $1 / $3; }
  46.     |    expr '%' expr
  47.             { $$ = $1 % $3; }
  48.     |    expr '|' expr
  49.             { $$ = $1 | $3; }
  50.     |    expr '&' expr
  51.             { $$ = $1 & $3; }
  52.     |    '-' expr %prec UMINUS
  53.             { $$ = - $2; }
  54.     |    LETTER
  55.             { $$ = regs[$1]; }
  56.     |    number
  57. /*     |    '?'
  58.             { yydebug = !yydebug; }
  59. */    ;
  60.  
  61. number    :    DIGIT
  62.             { $$ = $1;  base = ($1 == 0) ? 8 : 10; }
  63.     |    number DIGIT
  64.             { $$ = base * $1 + $2; }
  65.     ;
  66.  
  67. %%
  68.  
  69. static int eol;
  70.  
  71. int
  72. yylex()
  73. {
  74.   int c;
  75.  
  76.   while ( (c=getchar()) == ' ') {}
  77.   if (c == '\n')
  78.     { eol = 1;
  79.       return 0; }
  80.   if (islower(c))
  81.     {
  82.       yylval = c - 'a';
  83.       return (LETTER);
  84.     }
  85.   if (isdigit(c))
  86.     {
  87.       yylval = c - '0';
  88.       return (DIGIT);
  89.     }
  90.   return (c);
  91. }
  92.  
  93. yyerror(s)
  94. char *s;
  95. {
  96.   printf("%s\n", s);
  97. }
  98.  
  99. main()
  100. {
  101.   for (;;)
  102.     {
  103.       eol = 0;
  104.       printflag = 0;
  105.  
  106.       if (yyparse()) printflag = 0;
  107.  
  108.       if (printflag) printf("%d\n", val);
  109.  
  110.       while (!eol) yylex();
  111.     }
  112. }
  113.